home *** CD-ROM | disk | FTP | other *** search
/ ASME's Mechanical Engine…ing Toolkit 1997 December / ASME's Mechanical Engineering Toolkit 1997 December.iso / edu_comp / lim-40.lzh / EMS-40.TXT
Text File  |  1987-09-17  |  42KB  |  1,185 lines

  1.  
  2. A Comparison of EMS 4.0 with EMS and EEMS 3.2
  3.  
  4. Report by Stephen T. Satchell
  5.  
  6. Revision B, September 17, 1987
  7.  
  8. ____________________________________________________________
  9.  
  10. Copyright 1987 Satchell Evaluations.
  11.  
  12. Permission is granted to all persons to freely duplicate and
  13. distribute this information with the following restrictions: (1)
  14. This document is transferred unmofigirf, with all notices in
  15. place. (2) No fee may be directly or indirectly charged for this
  16. information EXCEPT by (a) on-line services and bulletin board systems
  17. that charge for access so long as no surcharge applied to this
  18. file, and (b) by professional computer societies (ACM, IEEE
  19. Computer and the like) which regularly publish a journal or
  20. magazine. User groups and for-profit groups are specifically
  21. prohibited from selling media (paper or machine readable)
  22. containing this information.
  23.  
  24. Permission for other uses may be requested from Satchell
  25. Evaluations, 16 Searing Avenue, Morristown NJ 07960. The author
  26. asks that people using any exerpt from this report contact him to
  27. insure the information is accurate to the author's best knowledge
  28. before publication.
  29.  
  30. This document is the result of the author's own initiative, and
  31. is not work for hire.
  32.  
  33. This work is derived from three published documents: (1) _The
  34. Lotus/Intel/Microsoft Expanded Memory Specification_ Version 3.20
  35. September 1985, (2) _Enhanced Expanded Memory Specification
  36. Version 3.20 June 1986, and (3) _Lotus/Intel/Microsoft Expanded
  37. Memory Specification_ Version 4.0 August 1987 (final printed
  38. version) The prior revision of this document was based on a
  39. laser printed manuscript.
  40.  
  41. Another document mentioned here is the _Generic Accelerator Card
  42. Driver (GACD) Specification_ available from AST Research Inc.
  43.  
  44. Intel is a trademark of Intel Corporation.
  45. Lotus is a trademark of Lotus Development Corporation.
  46. Microsoft is a trademark of Microsoft Corporation.
  47.  
  48. ____________________________________________________________
  49.  
  50. Preface to Revision B:
  51. ----------------------
  52.  
  53. The original version of this document was based on the EMS 4.0
  54. specification handed out to the press at the August 19th
  55. announcement. Since then, Intel informed the author that this
  56. copy of the specification was preliminary and contained several
  57. errors that are corrected in the final printed version of the
  58. specification. Unfortunately, both documents carry the same
  59. version, part number and date. The ONLY difference is that the
  60. correct document is in the 5x8.5 format, while the document
  61. containing errors is 8.5x11.
  62.  
  63. The original of this document was in two pieces: the comparision
  64. and a separate error/problem sheet. These two pieces are now
  65. combined into the single document as the elimination of the typos
  66. "correct" the problems found. Programmers are urged to consider
  67. that some of the driver implementers are human, and might read
  68. things into the specification that simply are not true. IN SHORT,
  69. WATCH OUT FOR BOUNDARY VIOLATIONS BY ENHANCED MEMORY MANAGERS.
  70.  
  71. The author understands the difference between physical and
  72. logical pages, but in some parts of the prior version of this
  73. document the author got mixed up and swapped terms. This has been
  74. corrected. A physical page is a 16 KB location in the 1 MB
  75. address space of the 80x86 system, while a logical page is a
  76. block of RAM that can be mapped into a physical page. 'Nuff said.
  77. Sorry.
  78.  
  79. The section on limits has been expanded considerably, based on
  80. documents from both Intel and AST. Other sections have been
  81. expanded as well, including minor corrections.
  82.  
  83. Buried in the back of the specification, this statement appears:
  84. ``To support generic accelerator cards, the support of Function
  85. 34, as defined by AST, is encouraged.'' Unfortunately, all copies
  86. of the AST EEMS specification in my posession do not have any
  87. concrete description of this function, and Intel didn't include
  88. this information. Interested persons should contact AST and ask
  89. for a copy of the _Generic Accelerator Card Driver (GACD)
  90. Specification_. I will attempt to obtain a copy of this and
  91. include the information in a future revision of this document.
  92.  
  93. ____________________________________________________________
  94.  
  95.  
  96. INTRODUCTION
  97. ------------
  98.  
  99. On August 19, 1987, the new version of the Expanded Memory
  100. Specification (EMS) was announced by Lotus, Intel and Microsoft.
  101. This new version of the specification includes many features of
  102. the Enhanced Expanded Memory Specification (EEMS) originally
  103. developed by AST Reserach, Quadram and Ashton-Tate, although the
  104. three original sponsoring companies elected not to make the new
  105. specification upward compatible with EEMS. AST Research indicated
  106. in a separate statement that they would endorse EMS 4.0 without
  107. reservation.
  108.  
  109. An important aside unrelated to this document is that Lotus
  110. Development Corporation has stated that pure software
  111. implementations of EMS 4.0 (those that do not use either
  112. dedicated memory hardware, PS/2 T-RAM or 80386 page mapping) will
  113. not be supported by Lotus products.
  114.  
  115. This paper attempts to compare EMS 4.0 with both EMS 3.2 and EEMS
  116. 3.2 specifications, by looking at each function. This is not
  117. intended to republish the specification -- interested parties are
  118. urged to contact Intel Corporation at (800) 538-3373 and ask for
  119. the "EMS 4.0 Developers Kit".
  120.  
  121. The functions will be listed by hexidemical code, not by abstract
  122. function number. This is of more use to developers since they
  123. tend to think of the functions based on the value loaded into the
  124. registers, not by an index. Where subfunctions are defined (such
  125. as in function 4Eh "Page Map Functions" the function and
  126. subfunction will be separated by a slash. Within the body of the
  127. text, I will indicate whether the EMS 4.0 function is upwardly
  128. compatible with the older specifications.
  129.  
  130. This document can also serve as a quick reference to those
  131. programmers already familiar with the EMS 4.0 specification and
  132. wanting a synopsis of the calling sequences for EMS operations.
  133. Programmers and interested parties wishing to fully understand
  134. the implications of each function is urged to examine the Base
  135. Document, _Lotus/Intel/Microsoft Expanded Memory Specification_
  136. Version 4.0, available from Intel by calling (800) 538-3373 and
  137. asking for the EMS 4.0 Developers Kit.
  138.  
  139.  
  140. MAJOR DIFFERENCES
  141. -----------------
  142.  
  143. One significant change is that the total amount of memory managed
  144. by an Expanded Memory Manager (EMM) has grown from 8 megabytes to
  145. "full-tilt-boogy" 32 megabytes (to quote a recent _InfoWorld_
  146. article) -- 512 pages to 2048 pages of 16 KB each. In this
  147. author's opinion, there is no reason a programmer should assume
  148. this is the absolute limit. THAT is dictated by the use of 16 bit
  149. signed values for page numbers, capping capacity at 32768 pages
  150. of 16 KB each -- 512 megabytes of RAM. Programs can interrogate
  151. the EMM for the actual amount available and tailor operations
  152. accordingly. Note the developers do not indicate whether the word
  153. values used for pages are signed or unsigned. If the values are
  154. intended to be unsigned, then 65535 (with page value FFFFh
  155. treated as a special value) can exist, or 16 KB short of one
  156. gigabyte of RAM in a single system.
  157.  
  158.  
  159. DEFINITION OF LIMITS
  160. --------------------
  161.  
  162. This is the worst part of the specification, since in no single
  163. place does the spec writers completely list the assumptions about
  164. limits, let alone future directions concerning those limits. Here
  165. is the author's ideas of the limits that drive the specification.
  166. Where possible the author has erred toward the more inclusive.
  167.  
  168.                      Maximum RAM: 32 MB today, future 512 MB
  169.  Minimum number of logical pages: 4 (64 KB).
  170.  Maximum number of logical pages: 2048 today, future 32768.
  171. Minimum number of physical pages: 4 (64 KB).
  172. Maximum number of physical pages: 64 (full 1 MB space).
  173.        Minimum number of handles: 64 (includes OS handle 00h).
  174.        Maximum number of handles: 255 (includes OS handle 00h).
  175.      Minimum # EMS 3.2 page maps: one per handle
  176.      Maximum # EMS 3.2 page maps: unbounded
  177.    Maximum size of mem reg array: 254 bytes
  178.  
  179. The "page maps" refer to contexts saved by functions 47h and 48h,
  180. Save Page Map and Restore Page Map.
  181.  
  182. The number of logical pages in a particular system can be
  183. obtained using function 42h; this also has the useful side effect
  184. of telling you the number of free pages as well.
  185.  
  186. The number of physical pages in a particular system can be
  187. obtained by using function 58h/01h and the particular mapping by
  188. using function 58h/00h. Should this function fail, you can assume
  189. you have four pages starting at the segment returned by function
  190. 41h.
  191.  
  192. The maximum number of handles that can be defined is 255. For
  193. those implementations that do not do any mapping in conventional
  194. memory, you can have 255 user handles. For those implementations
  195. that map into conventional memory, you can have 254 user handles
  196. and the special operating system handle. Note that handle values
  197. can range from 01h to FFh in the first case, or from 00h to FEh
  198. in the second.
  199.  
  200. The maximum number of handles in a particular system can be
  201. obtained by using function 54h/02h. Should this function fail,
  202. you can make no assumptions about the number of handles
  203. available.
  204.  
  205.  
  206. GOTCHAS
  207. -------
  208.  
  209. This section is what was left from the errata file in the prior
  210. version. If you prefer to work with possibly incorrect
  211. implementations of the EMS specification, pay particular heed to
  212. the comments here, as they can save you untold grief when you
  213. (and other programs in a system) stretch an expanded memory
  214. manager to the limit and beyond. The author makes NO claim that
  215. he has found all of these; if you discover another, please let
  216. the author know so he can add your new gotcha to the next
  217. revision (and you will receive credit for your contribution).
  218.  
  219. 46h -- Get Version [7]
  220. ===
  221.  
  222. There exists some confusion whether the version returned is the
  223. specification supported or the version number of the driver.
  224. Programmers are united in stating this should be the
  225. specification version supported, while at least one vendor
  226. (Intel) is known to use this function to return the software
  227. version of the particular implementation.
  228.  
  229. The wording of the description indicates that the vendor revision
  230. is intended, and thus is useless to programmers wishing to be
  231. able to adapt to the environment they encounter. The author
  232. considers this a severe weakness in the specification. Either a
  233. different function should be provided for returning vendor
  234. specific version information or other means for obtaining the
  235. current implementation version should be provided and documented
  236. by each vendor.
  237.  
  238.  
  239. Function 4Dh, Get All Handles [14]
  240. ============
  241.  
  242. BX is specified to have a maximum value of 255. A non-conforming
  243. implementation could indeed allow 256 handles, assuming that
  244. since handles can range in value from 00h to FFh that the full
  245. range should be implemented.
  246.  
  247. Consider allowing for 256 entries in the array instead of the 255
  248. entries as indicated in the example for this function.
  249.  
  250. There is also a problem with identifying the difference between a
  251. raw handle and a standard handle. Currently there is no facility
  252. to make this determination. Obviously the program making the
  253. allocation needs to keep this straight, but another program
  254. happening onto a raw handle (such as a debug program) has no way
  255. of really knowing. Unfortunate oversight, especially since the
  256. specification makes no comment about whether the page count is
  257. EMS pages, raw pages, or a funny number.
  258.  
  259.  
  260. Function 54h Subfunction 00h, Get Handle Directory [21/0]
  261. ============
  262.  
  263. Consider allow for 256 names in the handle directory array
  264. instead of 255 should a particular implementation violate the
  265. limit set up in the specification.
  266.  
  267.  
  268. Function 56h Subfunctions 00h/01h, Alter Page Map and Call [23]
  269. ============
  270.  
  271. The function description indicates that register and flag
  272. contents (except for AX) are preserved going to the called
  273. function. This means that BX, CX, DI, and ES are available for
  274. passing values to the called function. Although not explicit, the
  275. flags and all registers EXCEPT AX are unmodified when returning
  276. from the remotely called function.
  277.  
  278. Since many compilers use AX to return integer values from
  279. functions, there needs to be examples showing how to preserve the
  280. value when making EMS calls. This may indeed require direct
  281. compiler support...something that will not happen overnight.
  282.  
  283. The specification does not indicate whether the EMM handle passed
  284. in DX must describe pages contained by both calling and called
  285. routines, or whether there can be two different handles involved
  286. as well.
  287.  
  288. MISSING
  289. =======
  290.  
  291. A function to return the current logical->physical mapping in a
  292. vendor-independent manner. This would be exceedingly useful in
  293. debuggers.
  294.  
  295.  
  296. FUNCTIONS DEFINED IN EMS 3.2 SPECIFICATION
  297. ------------------------------------------
  298.  
  299. 40h -- Get Status [1]
  300. ===
  301.  
  302. On call:        AH = 40h
  303. On return:      AH = error status
  304. Error Status:   00h, 80h, 81h, 84h
  305.  
  306. Upward and downward compatible with both EMS and EEMS 3.2.
  307.  
  308.  
  309. 41h -- Get Page Frame Segment Address [2]
  310. ===
  311.  
  312. On call:        AH = 41h
  313. On return:      AH = error status
  314.                 BX = page frame segment address
  315. Error Status:   00h, 80h, 81h, 84h
  316.  
  317. Upward and downward compatible with both EMS and EEMS 3.2.
  318.  
  319.  
  320. 42h -- Get Unallocated Page Count [3]
  321. ===
  322.  
  323. On call:        AH = 42h
  324. On return:      AH = error status
  325.                 BX = number of unallocated pages
  326.                 DX = number of total pages
  327. Error Status:   00h, 80h, 81h, 84h
  328.  
  329. Upward and downward compatible with both EMS and EEMS 3.2. Note
  330. that EMS and EEMS 3.2 had no mechanism to return the maximum
  331. number of handles that can be allocated by programs. This is
  332. handled by the EMS 4.0 new function 54h/02h.
  333.  
  334.  
  335. 43h -- Allocate Pages [4]
  336. ===
  337.  
  338. On call:        AH = 43h
  339.                 BX = number of 16 KB pages requested (zero OK)
  340. On return:      AH = error status
  341.                 DX = handle
  342. Error Status:   00h, 80h, 81h, 84h, 85h, 87h, 88h
  343.  
  344. Upward compatible with both EMS and EEMS 3.2; EMS and EEMS 3.2 do
  345. not allow the allocation of zero pages (returns error status
  346. 89h). EMS 4.0 does allow zero pages to be requested for a handle,
  347. allocating pages later using function 51h, Reallocate Pages.
  348.  
  349.  
  350. 44h -- Map/Unmap Handle Page [5]
  351. ===
  352.  
  353. On call:        AH = 44h
  354.                 AL = physical page to be mapped
  355.                 BX = logical page to be mapped (-1 to unmap)
  356.                 DX = handle
  357. On return:      AH = error status
  358. Error Status:   00h, 80h, 81h, 83h, 84h, 8Ah, 8Bh
  359.  
  360. Upward compatible with both EMS and EEMS 3.2; EMS and EEMS 3.2 do
  361. not support unmap (logical page FFFFh) capability. Also, E/EMS
  362. 3.2 specified there were precisely four physical pages; EMS 4.0
  363. uses the subfunctions of function 58h to return the permitted
  364. number of physical pages.
  365.  
  366. This incorporates the functionality of function 69h ("function
  367. 42") of EEMS.
  368.  
  369.  
  370. 45h -- Deallocate Pages [6]
  371. ===
  372.  
  373. On call:        AH = 45h
  374.                 DX = handle
  375. On return:      AH = error status
  376. Error Status:   00h, 80h, 81h, 83h, 84h, 86h
  377.  
  378. Upward and downward compatible with both EMS and EEMS 3.2.
  379.  
  380.  
  381. 46h -- Get Version [7]
  382. ===
  383.  
  384. On call:        AH = 46h
  385. On return:      AH = error status
  386.                 AL = version number
  387. Error Status:   00h, 80h, 81h, 84h
  388.  
  389. Upward and downward compatible with both EMS and EEMS 3.2.
  390.  
  391. See the GOTCHA section for a discussion about a problem with this
  392. function. It appears that the intended use for this function is
  393. to return the version of the vendor implementation of the
  394. expanded memory manager instead of the specification version. In
  395. short, this function is useless to the vendor-independant
  396. programmer as defined.
  397.  
  398.  
  399. 47h -- Save Page Map [8]
  400. ===
  401.  
  402. On call:        AH = 47h
  403.                 DX = caller's EMM handle (NOT current EMM handle)
  404. On return:      AH = error status
  405. Error Status:   00h, 80h, 81h, 83h, 84h, 8Ch, 8Dh
  406.  
  407. Upward and downward compatible with both EMS and EEMS 3.2.
  408.  
  409. This only saves the context saved in EMS 3.2 specification; if a
  410. driver, interrupt routine or TSR needs to do more, functions 4Eh
  411. (Page Map functions) or 4Fh (Partial Page Map functions) should
  412. be used.
  413.  
  414. The specification is silent about the number of save contexts to
  415. provide. AST recommends in their Rampage AT manual one save context
  416. for each handle plus one per possible interrupt (5 + <handles>).
  417. In the LIMITS section of the document the minimum number of save
  418. contexts is the number of handles.
  419.  
  420.  
  421. 48h -- Restore Page Map [9]
  422. ===
  423.  
  424. On call:       AH = 48h
  425.                DX = caller's EMM handle (NOT current EMM handle)
  426. On return:     AH = error status
  427. Error Status:  00h, 80h, 81h, 83h, 84h, 8Eh
  428.  
  429. Upward and downward compatible with both EMS and EEMS 3.2.
  430.  
  431. This only restores the context saved in EMS 3.2 specification; if
  432. a driver, interrupt routine or TSR needs to do more, functions
  433. 4Eh (Page Map functions) or 4Fh (Partial Page Map functions)
  434. should be used.
  435.  
  436.  
  437. 49h -- (reserved) [10]
  438. ===
  439.  
  440. This function formerly returned the page mapping register I/O
  441. port array. Use of this function is discouraged, and in EMS 4.0
  442. may conflict with the use of the new functions (4Fh through 5Dh).
  443.  
  444.  
  445. 4Ah -- (reserved) [11]
  446. ===
  447.  
  448. This function formerly returned the page translation array. Use
  449. of this function is discouraged, and in EMS 4.0 may conflict with
  450. the use of the new functions (4Fh through 5Dh).
  451.  
  452. It is odd that no function presents in a vendor-independent
  453. manner the current mapping of logical pages to physical pages.
  454. This would be exceedingly handy in a debugging environment (such
  455. as Periscope or CodeView) in trying to track down bugs in
  456. programs using expanded memory.
  457.  
  458.  
  459. 4Bh -- Get Handle Count [12]
  460. ===
  461.  
  462. On call:       AH = 4Bh
  463. On return:     AH = error status
  464.                BX = handle count
  465. Error Status:  00h, 80h, 81h, 84h
  466.  
  467. Upward and downward compatible with EMS and EEMS 3.2.
  468.  
  469.  
  470. 4Ch -- Get Handle Pages [13]
  471. ===
  472.  
  473. On call:       AH = 4Ch
  474.                DX = handle
  475. On return:     AH = status
  476.                BX = pages allocated to handle
  477. Error Status:  00h, 80h, 81h, 83h, 84h
  478.  
  479. This function is upward compatible with EMS and EEMS 3.2. It is
  480. interesting to note how foolish the spec writers were, in that
  481. the E/EMS 3.2 spec writers state that "[the contents of BX] never
  482. exceeds 512 because the EMM allows, at most, 512 pages of
  483. expanded memory." EMS 4.0 makes a lie of this statement, yet
  484. falls into the same trap by stating that the contents of BX will
  485. never exceed 2048. DON'T BELIEVE IT. This author suspects that
  486. future versions of the spec will make the EMS 4.0 specification
  487. lie, too.
  488.  
  489. The programmer should make no assumptions about the order handles
  490. appear in the array.
  491.  
  492. Paranoid programmers (like the author) should compare the number
  493. returned in BX with the maximum number of pages returned by
  494. function 42h register DX, total number of EMM pages. This should
  495. be an UNSIGNED comparison, just in case the spec writers decide
  496. to use 16 bit unsigned numbers (for a maximum space of one
  497. gigabyte) instead of signed numbers (for a maximum space of 512
  498. megabytes). Unsigned comparisons will work properly in either
  499. case, and the author recommends the use of unsigned comparisons.
  500.  
  501.  
  502. 4Dh -- Get All Handle Pages [14]
  503. ===
  504.  
  505. On call:       AH = 4Dh
  506.                DI = offset to 1020 byte array
  507.                ES = segment selector for 1020 byte array
  508. On return:     AH = error status
  509.                BX = number of active handles (1-255)
  510. Error Status:  00h, 80h, 81h, 84h
  511.  
  512. NOT COMPATIBLE with EMS or EEMS 3.2, since the new special OS
  513. handle 0000h is returned as part of the array. Unless benign use
  514. of this information is used (such as displaying the handle and
  515. count of pages associated with the handle) code should be changed
  516. to only work with handles between 01h and FFh and to specifically
  517. ignore handle 00h.
  518.  
  519. The array consists of an array of 255 elements. The first word of
  520. each element is the handle number, the second word contains the
  521. number of pages allocated.
  522.  
  523. PROBLEM: There are two types of handles, "standard" and "raw".
  524. The specification does not talk about how this function works
  525. when both raw and standard handles exist in a given system. There
  526. currently is NO way to differentiate between a standard handle
  527. and a raw handle in EMS 4.0 that the author can find. Ooops. This
  528. is particularly painful in debuggers when the hardware and EMM
  529. support raw pages whose size differs from the 16 KB standard page
  530. size.
  531.  
  532.  
  533. 4Eh -- Page Map Functions [15]
  534. ===
  535.  
  536. This group of four sub-functions are provided for context
  537. switching required by operating environments and systems. These
  538. functions are upward and downward compatible with both EMS and
  539. EEMS 3.2; in addition, these functions now include the
  540. functionality of EEMS function 6Ah ("function 43") involving all
  541. pages.
  542.  
  543. The size and contents of the mag register (map reg) array will
  544. vary from system to system based on hardware vendor, software
  545. vendor, number of boards and the capacity of each board in the
  546. system. Note the array size can be determined by function
  547. 4Eh/03h.
  548.  
  549.  
  550. 4Eh/00h -- Get Page Map [15/0]
  551.  
  552. On call:       AH = 4Eh
  553.                AL = 00h
  554.                DI = offset to target array
  555.                ES = segment selector for target array
  556. On return:     AH = error status
  557. Error Status:  00h, 80h, 81h, 84h, 8Fh
  558.  
  559.  
  560. 4Eh/01h -- Set Page Map [15/1]
  561.  
  562. On call:       AH = 4Eh
  563.                AL = 01h
  564.                SI = offset to source array
  565.                DS = segment selector for source array
  566. On return:     AH = error status
  567. Error Status:  00h, 80h, 81h, 84h, 8Fh, A3h
  568.  
  569.  
  570. 4Eh/02h -- Get and Set Page Map [15/2]
  571.  
  572. On call:       AH = 4Eh
  573.                AL = 02h
  574.                SI = offset to source array (new context)
  575.                DI = offset to target array (old context)
  576.                DS = segment selector for source array
  577.                ES = segment selector for target array
  578. On return:     AH = error status
  579. Error Status:  00h, 80h, 81h, 84h, 8Fh, A3h
  580.  
  581.  
  582. 4Eh/03h -- Get Size of Page Map Save Array [15/3]
  583.  
  584. On call:       AH = 4Eh
  585.                AL = 03h
  586. On return:     AH = error status
  587.                AL = size in bytes of array
  588. Error Status:  00h, 80h, 81h, 84h, 8Fh
  589.  
  590.  
  591. FUNCTIONS NEW TO EMS 4.0
  592. ------------------------
  593.  
  594. 4Fh -- Partial Page Map Functions [16]
  595. ===
  596.  
  597. This group of four sub-functions are provided for context
  598. switching required by interrupt routines, operating environments
  599. and systems. This set of functions provides extended
  600. functionality over the EEMS function 6Ah ("function 43")
  601. involving subsets of pages. In EEMS, a subset of pages could be
  602. specified by starting position and number of pages; in this
  603. function a list of pages is specified, which need not be
  604. contiguous.
  605.  
  606. Interrupt routines can use this function in place of functions
  607. 47h and 48h, especially if the interrupt routine wants to use
  608. more than the standard four physical pages.
  609.  
  610. The page map is a structure of words. The first word indicate the
  611. number of pages specified. The remaining words contain the
  612. segment selector (NOT the physical page number) for each page.
  613. Translation from physical page number to segment selectors can be
  614. performed using function 58h/00h, Get Mappable Physical Address
  615. Array.
  616.  
  617. The size and contents of the mag register (map reg) array will
  618. vary from system to system based on hardware vendor, software
  619. vendor, number of boards and the capacity of each board in the
  620. system. Note the array size can be determined by function
  621. 4Fh/02h.
  622.  
  623. NOTE: there is no equivelant to 4Eh/02h, Get And Set, in this
  624. group of functions. From the point of view of system maintenance,
  625. the author would have preferred that subfunction 02h be reserved
  626. and the get-size command be subfunction 03h. Unfortunatly the die
  627. is cast.
  628.  
  629.  
  630. 4Fh/00h -- Get Partial Page Map [16/0]
  631.  
  632. On call:       AH = 4Fh
  633.                AL = 00h
  634.                SI = offset of page specification array
  635.                DI = offset of target map reg array
  636.                DS = segment selector of page spec array
  637.                ES = segment selector of target map reg array
  638. On return:     AH = error status
  639. Error Status:  00h, 80h, 81h, 84h, 8Bh, 8Fh, A3h
  640.  
  641.  
  642. 4Fh/01h -- Set Partial Page Map
  643.  
  644. On call:       AH = 4Fh
  645.                AL = 01h
  646.                SI = offset of source map reg array
  647.                DS = segment selector of source map reg array
  648. On return:     AH = error status
  649. Error Status:  00h, 80h, 81h, 84h, 8Fh, A3h
  650.  
  651.  
  652. 4Fh/02h -- Get Size of Partial Page Map Save Array
  653.  
  654. On call:       AH = 4Fh
  655.                BX = number of pages in page spec array
  656. On return:     AH = error status
  657.                AL = size in bytes of mag reg array
  658. Error Status:  00h, 80h, 81h, 84h, 8Bh, 8Fh
  659.  
  660.  
  661. 50h -- Map/Unmap Multiple Pages [17/0][17/1]
  662. ===
  663.  
  664. On call:       AH = 50h
  665.                AL = 00h (by physical page) or 01h (by seg#)
  666.                CX = number of mapping word pairs in array
  667.                DX = handle
  668.                SI = offset of source map array
  669.                DS = segment selector of source map array
  670. On return:     AH = error status
  671. Error Status:  00h, 80h, 81h, 83h, 84h, 8Ah, 8Bh, 8F
  672.  
  673. New function permits multiple logical-to-physical assignments to
  674. be made in a single call.
  675.  
  676. The source map array is an array of word pairs. The first word of
  677. a pair contains the logical page to map (FFFFh if the physical
  678. page is to be totally unmapped) and the second word of a pair
  679. contains the physical page number (subfunction 00h) or the
  680. segment selector (subfunction 01h) of the physical page in which
  681. the logical page shall be mapped.
  682.  
  683. A map of available physical pages (by physical page number and
  684. segment selectors) can be obtained using function 58h/00h, Get
  685. Mappable Physical Address Array.
  686.  
  687.  
  688. 51h -- Reallocate pages [18]
  689. ===
  690.  
  691. On call:       AH = 51h
  692.                BX = number of pages desired at return
  693.                DX = handle
  694. On return:     AH = error status
  695.                BX = number of pages now associated with handle
  696. Error Status:  00h, 80h, 81h, 83h, 84h, 87h, 88h
  697.  
  698. New function which permits the number of pages associated with a
  699. handle to be decreased or increased.
  700.  
  701.  
  702. 52h -- Handle Attribute Functions [19]
  703. ===
  704.  
  705. Something new added to the EMS specification is the ability to
  706. mark a handle and pages assoicated with a handle as non-volatile
  707. -- preserved across a warm boot of the system. The specification
  708. indicates that few if any EMS systems will support such a feature
  709. since the EMS hardware must insure the data remains valid
  710. throughout the warm boot sequence.
  711.  
  712. Currently the only attribute supported is non-volatile handles
  713. and pages, indicate by the least significant bit.
  714.  
  715.  
  716. 52h/00h -- Get Handle Attribute [19/0]
  717.  
  718. On call:       AH = 52h
  719.                AL = 00h
  720.                DX = handle
  721. On return:     AH = error status
  722.                AL = handle attribute
  723. Error Status:  00h, 80h, 81h, 83h, 84h, 8Fh, 91h
  724.  
  725.  
  726. 52h/01h -- Set Handle Attribute [19/1]
  727.  
  728. On call:       AH = 52h
  729.                AL = 01h
  730.                BL = new attribute value
  731.                DX = handle
  732. On return:     AH = error status
  733. Error Status:  00h, 80h, 81h, 83h, 84h, 8Fh, 90h, 91h
  734.  
  735.  
  736. 52h/02h -- Get Handle Attribute Capability [19/2]
  737.  
  738. On call:       AH = 52h
  739.                AL = 02h
  740. On return:     AH = error status
  741.                AL = attribute capability
  742. Error Status:  00h, 80h, 81h, 83h, 84h, 8Fh
  743.  
  744.  
  745. 53h -- Handle Name Functions [20]
  746. ===
  747.  
  748. EMS handles may have names associated with them. Each name can be
  749. any eight characters. Functions 53h and 54h provide a way of
  750. setting and interrogating the names associated with a particular
  751. handle. Function 53h manipulates names by number.
  752.  
  753. A name of eight nulls is special, and indicates a handle has no
  754. name. Note, by the way, that nulls have no special significance,
  755. and they can appear in the middle of the name. In short, the
  756. handle name is 64 bits of binary information so far as the
  757. expanded memory manager is concerned. The author recommends that
  758. when defining a handle name that the selected name be padded on
  759. the right with spaces, ASCII graphic characters be used, and that
  760. control codes and hi-bit-set characters be avoided to make a
  761. debugger's life easier.
  762.  
  763.  
  764. 53h/00h -- Get Handle Name [20/0]
  765.  
  766. On call:       AH = 53h
  767.                AL = 00h
  768.                DX = handle
  769.                DI = offset to eight byte target
  770.                ES = segment selector of eight byte target
  771. On return:     AH = error status
  772. Error Status:  00h, 80h, 81h, 83h, 84h, 8Fh
  773.  
  774.  
  775. 53h/01h -- Set Handle Name [20/1]
  776.  
  777. On call:       AH = 53h
  778.                AL = 01h
  779.                DX = handle
  780.                SI = offset to eight byte source
  781.                DS = segment selector to eight byte source
  782. On return:     AH = error status
  783. Error Status:  00h, 80h, 81h, 83h, 84h, 8Fh, A1h
  784.  
  785.  
  786. 54h -- Handle Directory Functions [21]
  787. ===
  788.  
  789. Function 54h manipulates handles by name.
  790.  
  791.  
  792. 54h/00h -- Get Handle Directory [21/0]
  793.  
  794. On call:       AH = 54h
  795.                AL = 00h
  796.                DI = offset to 2550 byte target array
  797.                ES = segment selector to 2550 byte target array
  798. On return:     AH = error status
  799.                AL = number of active handles
  800. Error Status:  00h, 80h, 81h, 84h, 8Fh
  801.  
  802. The name array consists of 10 byte entries; each entry has a word
  803. containing the handle number, followed by the eight byte (64 bit)
  804. name.
  805.  
  806.  
  807. 54h/01h -- Search for Named Handle [21/1]
  808.  
  809. On call:       AH = 54h
  810.                AL = 01h
  811.                SI = offset to 8 byte array with name
  812.                DS = segment selector to 8 byte array
  813. On return:     AH = error status
  814.                DX = handle [number]
  815. Error Status:  00h, 80h, 81h, 84h, 8Fh, A0h, A1h
  816.  
  817.  
  818. 54h/02h -- Get Total Handles [21/2]
  819.  
  820. On call:       AH = 54h
  821.                AL = 02h
  822. On return:     AH = error status
  823.                BX = maximum number of handles
  824. Error Status:  00h, 80h, 81h, 84h, 8Fh
  825.  
  826. This is NOT the current number of handles defined, but the
  827. maximum number of handles that can be supported in the current
  828. environment.
  829.  
  830.  
  831. 55h -- Alter Page Map and Jump (cross page branch) [22]
  832. ===
  833.  
  834. On call:       AH = 55h
  835.                AL = 00h (by physical page) or 01h (by seg#)
  836.                DX = handle
  837.                SI = offset to jump target and mapping table
  838.                DS = segment selector for target/map table
  839. On return:     AH = error status
  840. Error Status:  00h, 80h, 81h, 83h, 84h, 8Ah, 8Bh, 8Fh
  841.  
  842. Flags and all registers except AX are preserved across the jump.
  843.  
  844. One of the problems plaguing programmers in paged systems is
  845. being able to place code in paged memory. This function allows
  846. for an unstructured branch from code in one bank to code in
  847. potentially another bank without defining a bank manager in
  848. conventional memory. Thus several applications do not have to
  849. duplicate code.
  850.  
  851. Note that code should follow the call to handle any error
  852. conditions that may arise. The programmer SHOULD NOT ASSUME the
  853. jump will always work. Graceful crashes are always preferable to
  854. sloppy ones...
  855.  
  856.  
  857. 56h -- Alter Page Map and Call (cross page call) [23/0][23/1]
  858. ===
  859.  
  860. On call:       AH = 56h
  861.                AL = 00h (by physical page) or 01h (by seg#)
  862.                DX = handle
  863.                SI = offset to jump target and mapping table
  864.                DS = segment selector for target/map table
  865. On return:     AH = error status
  866. Error Status:  00h, 80h, 81h, 83h, 84h, 8Ah, 8Bh, 8Fh
  867.  
  868. Flags and all registers except AX are preserved to the called
  869. routine. On return, flags and all registers except AX are
  870. preserved; AL is set to zero and AX is undefined.
  871.  
  872. One common calling convention is useless with this function:
  873. indicating an error by incrementing the return address before
  874. issuing a RET instruction. Obviously the return address is within
  875. the expanded memory manager, and if you increment the address
  876. "the results are undefined" to quote an ANSI language standards
  877. document. "Sloppy crash" is probably more accurate.
  878.  
  879. PROBLEM: AX is not preserved on the return leg of the call. This
  880. is a particular pain to C and PASCAL programmers since the most
  881. common way to return integer values is in AX. The amount of stack
  882. space required by the function call cannot be determined at
  883. compile time. It CAN be determined at run time, using function
  884. 56h/02h, so at least the parameter frame can be located.
  885. Unfortunately this plays hob with using BP for both parameters
  886. and local storage. The best thing is to define a series of
  887. assembler wrapper routines that (1) copies the parameter stack to
  888. the new function and (2) preserves AX on return. This means
  889. redesigning functions to pass structures and the size of
  890. structures instead of individual parameters, a performance
  891. problem.
  892.  
  893.  
  894. 56h/02h -- Get Page Map Stack Space Size [23/2]
  895.  
  896. On call:       AH = 56h
  897.                AL = 02h
  898. On return:     AH = error status
  899.                BX = number of bytes of stack used per call
  900. Error Status:  00h, 80h, 81h, 84h, 8Fh
  901.  
  902. The author assumes the value returned in BX is even, to match the
  903. requirements of the 80x86 architecture. Implementers should check
  904. to be sure they follow this important guideline.
  905.  
  906.  
  907. 57h -- Memory Manipulation [24]
  908. ===
  909.  
  910. The request block is a structure with the following format:
  911.  
  912.     doubleword: region length in bytes
  913.           byte: 0=source in conventional; 1=source in expanded
  914.           word: source handle
  915.           word: source offset in page or selector
  916.           word: source logical page (exp.) or selector (conv.)
  917.           byte: 0=target in conventional; 1=target in expanded
  918.           word: target handle
  919.           word: target offset in page or selector
  920.           word: target logical page (exp.) or selector (conv.)
  921.  
  922. Expanded memory allocated to a handle is considered to be a
  923. linear array, starting from logical page 0 and progressing
  924. through logical page 1, 2, ... n, n+1, ... up to the last logical
  925. page in the handle.
  926.  
  927.  
  928. 57h/00h -- Move Memory Region [24/0]
  929.  
  930. On call:       AH = 57h
  931.                AL = 00h
  932.                SI = offset to request block
  933.                DS = segment selector to request block
  934. On return:     AH = error status
  935. Error Status:  00h, 80h, 81h, 83h, 84h, 8Ah, 8Fh, 92h, 93h,
  936.                94h, 95h, 96h, 98h, A2h
  937.  
  938. Moves data between two memory areas. Includes moves between paged
  939. and non-pages areas, or between two different paged areas.
  940.  
  941.  
  942. 57h/01h -- Exchange Memory Region [24/1]
  943.  
  944. On call:       AH = 57h
  945.                AL = 01h
  946.                SI = offset to request block
  947.                DS = segment selector to request block
  948. On return:     AH = error status
  949. Error Status:  00h, 80h, 81h, 83h, 84h, 8Ah, 8Fh, 93h,
  950.                94h, 95h, 96h, 97h, 98h, A2h
  951.  
  952. Exchanges data between two memory areas. Includes exchanges
  953. between paged and non-pages areas, or between two different paged
  954. areas.
  955.  
  956.  
  957. 58h -- Mappable Physical Address Array [25]
  958. ===
  959.  
  960. These functions let you obtain a complete map of the way physical
  961. memory is laid out in a vendor independent manner. This is a
  962. functional equivalent of EEMS function 68h ("function 41"). EEMS
  963. function 60h ("function 33") is a subset call of 68h.
  964.  
  965.  
  966. 58h/00h -- Get Array [25/0]
  967.  
  968. On call:       AH = 58h
  969.                AL = 00h
  970.                DI = offset to target array
  971.                ES = segment selector to target array
  972. On return:     AH = error status
  973.                CX = entries in target array
  974. Error Status:  00h, 80h, 81h, 84h, 8Fh
  975.  
  976. The information returned is in an array composed of word pairs.
  977. The first word is the physical page's segment selector, the
  978. second word the physical page number. Note that values are not
  979. necessarily returned in a particular order, either
  980. ascending/decending segment selector values or as
  981. ascending/decending physical page number.
  982.  
  983. For compatibility with earlier EMS specifications, physical page
  984. zero contains the segment selector value returned by function
  985. 41h, and physical pages 1, 2 and 3 return segment selector values
  986. that corrospond to the physical 16 KB blocks immediately
  987. following physical page zero.
  988.  
  989.  
  990. 58h/01h -- Get Array Entries [25/1]
  991.  
  992. On call:       AH = 58h
  993.                AL = 01h
  994. On return:     AH = error status
  995.                CX = number of entries returned by 58h/00h
  996. Error Status:  00h, 80h, 81h, 84h, 8Fh
  997.  
  998. Multiply CX by 4 for the byte count.
  999.  
  1000.  
  1001. 59h -- Hardware Information [26]
  1002. ===
  1003.  
  1004. These functions return information specific to a given hardware
  1005. implementation and to use of raw pages as opposed to standard
  1006. pages. The intent is that only operating system code ever need
  1007. use these functions.
  1008.  
  1009.  
  1010. 59h/00h -- Get EMS Hardware Info [26/0]
  1011.  
  1012. On call:       AH = 59h
  1013.                AL = 00h
  1014.                DI = offset of target array (10 bytes)
  1015.                ES = segment selector of target array
  1016. On return:     AH = error status
  1017. Error Status:  00h, 80h, 81h, 84h, 8Fh, A4h
  1018.  
  1019. The target array has the following format:
  1020.  
  1021.      word: raw page size in paragraphs (multiples of 16 bytes)
  1022.      word: number of alternate register sets
  1023.      word: size of page maps (function 4Eh [15])
  1024.      word: number of alternate registers sets for DMA
  1025.      word: DMA operation -- see full specification
  1026.  
  1027.  
  1028. 59h/01h -- Get Unallocated Raw Page Count [26/1]
  1029.  
  1030. On call:       AH = 59h
  1031.                AL = 01h
  1032. On return:     AH = error status
  1033.                BX = unallocated raw pages
  1034.                DX = total raw pages
  1035. Error Status:  00h, 80h, 81h, 84h, 8Fh
  1036.  
  1037.  
  1038. 5Ah -- Allocate Raw Pages [27]
  1039. ===
  1040.  
  1041. On call:       AH = 5Ah
  1042.                BX = raw page count
  1043. On return:     AH = error status
  1044.                DX = handle
  1045. Error Status:  00h, 80h, 81h, 84h, 85h, 87h, 88h
  1046.  
  1047. It is intended this call be used only by operating systems.
  1048.  
  1049.  
  1050. 5Bh -- Alternate Map Register Set [28]
  1051. ===
  1052.  
  1053. Some boards support multiple sets of mapping registers, some for
  1054. the specific purpose of performing DMA. These functions access
  1055. the special features if they are available.
  1056.  
  1057. It is intended these functions be used only by an operating
  1058. system.
  1059.  
  1060. This set of functions performs the same functions at EEMS
  1061. function 6Ah subfunctions 04h and 05h ("function 43").
  1062.  
  1063. In the interests of brevity, the calls are not detailed here. For
  1064. more information, please refer to the base document.
  1065.  
  1066.  
  1067. 5Bh/00h -- Get Alternate Map Register Set [28/0]
  1068. 5Bh/01h -- Set Alternate Map Register Set [28/1]
  1069. 5Bh/02h -- Get Alternate Map Save Array Size [28/2]
  1070. 5Bh/03h -- Allocate Alternate Map Register Set [28/3]
  1071. 5Bh/04h -- Deallocate Alternate Map Register Set [28/4]
  1072. 5Bh/05h -- Allocate DMA Register Set [28/5]
  1073. 5Bh/06h -- Enable DMA on Alternate Map Register Set [28/6]
  1074. 5Bh/07h -- Disable DMA on Alternate Map Register Set [28/7]
  1075. 5Bh/08h -- Deallocate DMA Register Set [28/8]
  1076.  
  1077.  
  1078. 5Ch -- Prepare EMS Hardware for Warm Boot [29]
  1079. ===
  1080.  
  1081. On call:       AH = 5Ch
  1082. On return:     AH = error status
  1083. Error Status:  00h, 80h, 81h, 84h
  1084.  
  1085. Provided for those hardware implementations that must be set up
  1086. to preserve contents across a warm boot.
  1087.  
  1088.  
  1089. 5Dh -- Operating System / Environment function control [30]
  1090. ===
  1091.  
  1092. Security feature for operating systems and operating environment
  1093. use. For brevity, the calls are not detailed here.
  1094.  
  1095. 5Dh/00h -- Enable OS/E Function Set [30/0]
  1096. 5Dh/01h -- Disable OS/E Function Set [30/1]
  1097. 5Dh/02h -- Return OS/E Access Key [30/2]
  1098.  
  1099.  
  1100. 61h -- Generic Accelerator Card Support [34]
  1101. ===
  1102.  
  1103. For more information, contact AST Research for a copy of the
  1104. _Generic Accelerator Card Driver (GACD) Specification_.
  1105.  
  1106. ERROR RETURNS
  1107. -------------
  1108.  
  1109. 00h -- Successful Completion
  1110.  
  1111. 80h -- Software Error
  1112.  
  1113. 81h -- Hardware Error
  1114.  
  1115. 82h -- EMM busy (dropped in E/EMS 3.2)
  1116.  
  1117. 83h -- Unknown EMM handle.
  1118.  
  1119. 84h -- Unknown function code in AH.
  1120.  
  1121. 85h -- All EMM handles are in use.
  1122.  
  1123. 86h -- Page save/restore context error.
  1124.  
  1125. 87h -- More pages requested than exist.
  1126.  
  1127. 88h -- Not enough free pages to satisfy allocation request.
  1128.  
  1129. 89h -- Zero page allocate request (dropped in EMS 4.0)
  1130.  
  1131. 8Ah -- Logical page out of range
  1132.  
  1133. 8Bh -- Physical page out of range
  1134.  
  1135. 8Ch -- No room in the map context save area
  1136.  
  1137. 8Dh -- Page context already saved
  1138.  
  1139. 8Eh -- No page context to restore
  1140.  
  1141. 8Fh -- Unknown sub-function
  1142.  
  1143. 90h -- Attribute type undefined (new)
  1144.  
  1145. 91h -- Warm boot data save not implemented (new)
  1146.  
  1147. 92h -- Move overlaps memory (new)
  1148.  
  1149. 93h -- Move/exchange larger than allocated region (new)
  1150.  
  1151. 94h -- Conventional/expanded regions overlap (new)
  1152.  
  1153. 95h -- Logical page offset outside of logical page (new)
  1154.  
  1155. 96h -- Region larger than 1 MB. (new)
  1156.  
  1157. 97h -- exchange source/destination overlap (new)
  1158.  
  1159. 98h -- source/destination undefined or not supported (new)
  1160.  
  1161. 99h -- (no status assigned)
  1162.  
  1163. 9Ah -- Alt. Map Reg. Sets supported, specified set is not (new)
  1164.  
  1165. 9Bh -- All alternate map & DMA registers sets allocated (new)
  1166.  
  1167. 9Ch -- Alternate Map & DMA register sets not supported (new)
  1168.  
  1169. 9Dh -- Alt Map Reg or DMA set no defined, allocated or is
  1170. currently defined set (new)
  1171.  
  1172. 9Eh -- Dedicated DMA channels not supported (new)
  1173.  
  1174. 9Fh -- Dedicated DMA channels supported; specifed channel is not
  1175. (new)
  1176.  
  1177. A0h -- Named handle could not be found (new)
  1178.  
  1179. A1h -- Handle Name already exists (new)
  1180.  
  1181. A2h -- Move/exchange wraps around 1 MB boundry (new)
  1182.  
  1183. A3h -- Data structure contains corrupted data (new)
  1184.  
  1185. A4h -- Access denied (new)